/** * Header login/signup dialog: open, close, focus trap, scroll lock. */ (function () { 'use strict'; var modal = document.getElementById('travelgo-auth-modal'); if (!modal) { return; } var dialog = modal.querySelector('.travelgo-auth-modal__dialog'); var prevFocus = null; var openers = document.querySelectorAll('.travelgo-auth-modal-open'); function isOpen() { return !modal.hasAttribute('hidden'); } function lockScroll(on) { document.documentElement.classList.toggle('travelgo-auth-modal--scroll-lock', on); } function focusables() { if (!dialog) { return []; } return Array.prototype.slice .call( dialog.querySelectorAll( 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])' ) ) .filter(function (el) { return el.offsetParent !== null || el === dialog; }); } function trapKey(e) { if (e.key !== 'Tab' || !dialog) { return; } var nodes = focusables(); if (nodes.length === 0) { return; } var first = nodes[0]; var last = nodes[nodes.length - 1]; if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } } var shell = modal.querySelector('.travelgo-auth-modal-panel'); function ensureRegisterPanelId() { var col2 = modal.querySelector('#customer_login .u-column2'); if (col2 && !col2.id) { col2.id = 'travelgo-auth-register-panel'; } } function resetRegisterPanel() { if (shell) { shell.classList.remove('travelgo-auth-modal-panel--register-open'); } var toggle = document.getElementById('travelgo-auth-register-toggle'); if (toggle) { toggle.setAttribute('aria-expanded', 'false'); } } function openRegisterPanel() { if (!shell) { return; } ensureRegisterPanelId(); var col2 = modal.querySelector('#customer_login .u-column2'); shell.classList.add('travelgo-auth-modal-panel--register-open'); var toggle = document.getElementById('travelgo-auth-register-toggle'); if (toggle) { toggle.setAttribute('aria-expanded', 'true'); } window.setTimeout(function () { var email = document.getElementById('reg_email'); if (email && typeof email.focus === 'function') { email.focus(); } else if (col2) { col2.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } }, 50); } function wireRegisterToggle() { var toggle = document.getElementById('travelgo-auth-register-toggle'); if (toggle) { toggle.addEventListener('click', function () { openRegisterPanel(); }); } var back = document.getElementById('travelgo-auth-back-to-login'); if (back) { back.addEventListener('click', function () { resetRegisterPanel(); var t = document.getElementById('travelgo-auth-register-toggle'); if (t && typeof t.focus === 'function') { t.focus(); } else if (dialog) { dialog.focus(); } }); } } ensureRegisterPanelId(); wireRegisterToggle(); function openModal() { if (isOpen()) { return; } prevFocus = document.activeElement; modal.removeAttribute('hidden'); modal.setAttribute('aria-hidden', 'false'); lockScroll(true); document.addEventListener('keydown', onDocKey); modal.addEventListener('keydown', trapKey); resetRegisterPanel(); ensureRegisterPanelId(); window.setTimeout(function () { if (dialog) { dialog.focus(); } window.dispatchEvent(new CustomEvent('travelgo:auth-modal-opened')); }, 10); } function closeModal() { if (!isOpen()) { return; } resetRegisterPanel(); modal.setAttribute('hidden', ''); modal.setAttribute('aria-hidden', 'true'); lockScroll(false); document.removeEventListener('keydown', onDocKey); modal.removeEventListener('keydown', trapKey); if (prevFocus && typeof prevFocus.focus === 'function') { prevFocus.focus(); } } function onDocKey(e) { if (e.key === 'Escape') { closeModal(); } } openers.forEach(function (el) { el.addEventListener('click', function (e) { e.preventDefault(); openModal(); }); }); modal.querySelectorAll('[data-travelgo-auth-modal-close]').forEach(function (el) { el.addEventListener('click', function () { closeModal(); }); }); })();